﻿#ifndef PILEREELS_H
#define PILEREELS_H
/**
 \file pilereels.h
 \brief Pile des réels
 \author Baptiste Pirault et  Hugo Dubois
 \date 01/06/2012
 \version 1
 **/
 
#include <QStack>
#include <QString>
#include <iostream>
#include <QSettings>

#include "exception.h"
#include "pileaffichage.h"
#include "fonctions.h"
#include "etat.h"
#include "pilestockage.h"

/*!
 \class pileReels
 \brief La classe gére des réels et permet de stocker les données transmises au clavier pour les exploiter
  Hérite de QStack<double>
  Les réels sont stockés en double.
  */
class pileReels : public pileStockage<double>
{
public:
    //! \brief Constructeur
    //!
    //! On fait appelle au constructeur de la classe abstraite et on appelle la méthode iniX() afin d'initialiser la pile
    //! \param *p : Pointeur sur la pile d'affichage
    //! \param *affichagePile : Pointeur sur QTextEdit. Affichage de l'interface
    pileReels(PileAffichage *p,QTextEdit *affichagePile)
        :pileStockage<double>(p,affichagePile)
    {
        iniX();
    }
	//! \brief Ajoute au réel X un nouveau caractère
	//!
	//! \param c : QString contenant le caractère (chiffre à rajouter)
	//! \return Retourne le double avec le nouveau réel créé
    void addX(const QString c);
	
	//! \brief Réninitialise les variables
	//! 
	//! Réinitialise les variables :  dot à false, x à 0, precision à 0 et décimal à 0.1
	//! \return Retourne la valeur du réel X.
    void iniX();
	
	//! \brief Accesseur du réel X
	//!
	//! \return Retourne le X en construction
    double getX()const;

	//! \brief Retourne le réel X en QString
	//!
	//! \return Retourne un QString contenant le réel. Mis en forme pour l'affichage (avec la virgule)
    QString getQStringX()const;
	
    //! \brief Met à jour l'afficheur de la pile
	//!
	//! Affiche dans l'interface le contenu de la pile
    void updateAfficheur()const;

	//! \brief Retire le dernier caractère ajouté à X
	//!
	//! \warning Ne marche qu'avant la virgule	
    void back();

    //! \brief Sauvegarde la pile dans le fichier mesOptions.ini
    void sauvegarder() const;

private:

	//! \brief Valeur Maximale du nombre de décimales
	//!	\def MAX_DECIMAL = 0.0000000000000001
    double MAX_DECIMAL;
	
	//! \brief Variable qui retient la position de la virgule
	//!
    //! La place de la virgule dans le réel s'il est décimal
    double decimal; // Pour construire un nombre à virgule, on doit retenir à quel virgule on en est
	
	//! \brief Stocke le nombre de chiffres du réel à afficher
    int precision; // Nombre de chiffres de X (pour l'affichage)

    //! \brief Booléen pour savoir si on est avant ou après la virgule
    bool dot;

    //! \brief Booléen pour savoir si x est négatif
    bool negatif;
};

QString toQString(const double x);

#endif // PILEREELS_H
